<?php
/**
 * Json Web Token 的实现
 * User: 季俊潇
 * Date: 2018/8/1
 * Time: 21:40
 */
namespace app\common\services;

class ApiJsonWebToken
{

    protected $key = 'e1b71ed946900ff4254b2422b91d100f';

    /**
     * 创建 Token
     * @param int $uid
     * @param int $expiration
     * @param string $encryption
     * @param bool $isAdmin
     * @return string
     */
    public function getToken($uid) {
        $expiration = 432000;
        $isAdmin = false;
        // JWT 头信息
        $header = ['type'=>'JWT','alg'=>'HS256'];
        // JWT 负载信息-包括Token内各类数据
        $payload = [
            'iss' =>	'zhongheng',			// 签发者
            'sub'	=>	'H5',				// 所面向的用户
            'exp'	=>	$expiration,		// 过期时间
            'nbf'	=>	time(),				// 在此时间之前该签名无效
            'iat'	=>	time(),				// 签发的时间
            'jti'	=>	microtime(),		// 唯一身份标示
            'uuid'	=>	$uid				// 用户唯一标示
        ];
        // 加密头信息
        $encryptHeader = base64_encode(json_encode($header,JSON_UNESCAPED_UNICODE));
        // 加密负载信息
        $encryptPayload = base64_encode(json_encode($payload,JSON_UNESCAPED_UNICODE));
        // 生成签名
        $signature = hash('sha256',$encryptHeader . $encryptPayload .$this->key);
        $token = $encryptHeader . '.' . $encryptPayload . '.' . $signature;
        return $token;
    }
    /**
     * 验证令牌是否合法
     * @param $token
     * @return bool
     * @throws UserLoginException
     */
    public function verifyToken($token)
    {
		// 解析token
        $tokenArr = explode('.',$token);
        if(false === $tokenArr || 3 !== count($tokenArr)){
            return false;
        }
        $header = json_decode(base64_decode($tokenArr[0]));
        $payload = json_decode(base64_decode($tokenArr[1]),true);
        if(empty($payload)){
            return false;
        }
        return $payload;
    }
}